﻿#include "stdafx.h"
#include "QCreateFileThread.h"
#include <QDebug>
#include <time.h>

#if defined(_MSC_VER) && (_MSC_VER >= 1600)  
# pragma execution_character_set("utf-8")  
#endif 


QCreateFileThread::QCreateFileThread(QObject *parent)
	: QThread(parent)
	, m_bCNName(false)
	, m_nFileNameLen(0)
	, m_bContentRandom(false)
	, m_nGenFileNum(0)
{
	m_Buffer = new char[1024*4];
}

QCreateFileThread::~QCreateFileThread()
{

}

QString getRandomString(int length)
{
	qsrand(QDateTime::currentMSecsSinceEpoch());//为随机值设定一个seed

	const char chrs[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
	int chrs_size = sizeof(chrs);

	char* ch = new char[length + 1];
	memset(ch, 0, length + 1);
	int randomx = 0;
	for (int i = 0; i < length; ++i)
	{
		randomx= rand() % (chrs_size - 1);
		ch[i] = chrs[randomx];
	}

	QString ret(ch);
	delete[] ch;
	return ret;
}

QString getRandChinese(int count)
{
	if(count<=0) return QString();
	int rand1 = 0xf7 - 0xb0;
	int rand2 = 0xfe - 0xa1;
	QString text;
	srand(time(NULL));
	for (int i = 0; i < count; ++i){
		QByteArray byte1, byte2;
		QByteArray str;
		byte1.append(rand() % rand1 + 0xb0);
		byte2.append(rand() % rand2 + 0xa1);
		str = byte1;
		str += byte2;
		text += QString::fromLocal8Bit(str);
		//qDebug()<<"str:"<<QString(str.toHex())<<text;
	}
	return text;
}
// 
// void QCreateFileThread::run()
// {
// 	QDir dir;
// 	dir.mkpath(m_strSaveDir);
// 
// 	for (int i=m_nStartFileNum; i<m_nEndFileNum; i++)
// 	{
// 		QString strCreateDir = m_strSaveDir;
// 		if (strCreateDir.endsWith('/') == false)
// 		{
// 			strCreateDir += "/";
// 		}
// 		for (int j=0; j<m_nDirLayerNum; j++)
// 		{
// 			if (m_bCNName)
// 			{
// 				strCreateDir += QString("%1_%2_%3/").arg(i+1).arg(j+1).arg(getRandChinese(5));
// 			}else{
// 				strCreateDir += QString("%1_%2_%3/").arg(i+1).arg(j+1).arg(getRandomString(5));
// 			}
// 		}
// 		QDir dir;
// 		dir.mkpath(strCreateDir);
// 		QString strFileName;
// 		if (m_bCNName)
// 		{
// 			strFileName = getRandChinese(m_nFileNameLen);
// 		}else{
// 			strFileName = getRandomString(m_nFileNameLen);
// 		}
// 		QString strFilePath = strCreateDir + QString("%1%2.dat").arg(strFileName).arg(i+1);
// 		QFile file(strFilePath);
// 		if(file.open(QIODevice::WriteOnly))
// 		{
// 			qint64 size = m_nFileKB;
// 			size *= 1024;
// 
// 			file.resize(size);
// 			file.close();
// 			emit sigUpdateStatus(strFilePath, (int)(((float)(i - m_nStartFileNum + 1)/(float)(m_nEndFileNum - m_nStartFileNum)) * 100.0), m_nIndex);
// 		}
// 	}
// }

void QCreateFileThread::CreateDir(QString strDir, int nLayer)
{
	QDir dir;
	dir.mkpath(strDir);

	if (nLayer < m_nDirLayerNum)
	{
		for (int j=0; j<m_nSubDirNumOther; j++)
		{
			QString strCreateDir = strDir;
			if (strCreateDir.endsWith('/') == false)
			{
				strCreateDir += "/";
			}
			if (m_bCNName)
			{
				strCreateDir += QString("%1_%2_%3/").arg(nLayer+1).arg(j+1).arg("文件夹");
			}else{
				strCreateDir += QString("%1_%2_%3/").arg(nLayer+1).arg(j+1).arg(getRandomString(m_nFileNameLen));
			}
			CreateDir(strCreateDir, nLayer + 1);
		}
		CreateFile(strDir, m_nSubFileNumMid);
	}
	else
	{
		CreateFile(strDir, m_nSubFileNumLast);
	}
}

void QCreateFileThread::CreateFile(QString strDir, int nNum)
{
	for (int i=0; i<nNum; i++)
	{
		QString strFileName;
		if (m_bCNName)
		{
			strFileName = "测试文件";//getRandChinese(m_nFileNameLen);
		}else{
			strFileName = getRandomString(m_nFileNameLen);
		}
		QString strFilePath = strDir + QString("%1%2.dat").arg(strFileName).arg(i+1);
		QFile file(strFilePath);
		if(file.open(QIODevice::WriteOnly))
		{
			qint64 size = m_nFileKB;
			size *= 1024;

			file.resize(size);
			file.close();

			m_nGenFileNum++;
			emit sigUpdateStatus(strFilePath, (int)(((float)(m_nGenFileNum)/(float)(m_nTotalFileNum)) * 100.0), m_nIndex);
		}
	}
}

void QCreateFileThread::run()
{
	int nMidDirNum = 0;
	int nLastDirNum = 0;

	int nTopDir = m_nEndFileNum - m_nStartFileNum;
	for (int i=0; i<m_nDirLayerNum; i++)
	{
		if ( i == 0)
		{
			nMidDirNum += 1;
		}
		else if (i == 1)
		{
			nMidDirNum += nTopDir;
		}
		else if (i != m_nDirLayerNum - 1)
		{
			nMidDirNum += (nTopDir * (qPow(m_nSubDirNumOther, i - 1)));
		}
		else
		{
			nLastDirNum += (nTopDir * (qPow(m_nSubDirNumOther, i - 1)));
		}
	}
	m_nTotalFileNum = nMidDirNum * m_nSubFileNumMid + nLastDirNum * m_nSubFileNumLast;

	QDir dir;
	dir.mkpath(m_strSaveDir);

	for (int i=m_nStartFileNum; i<m_nEndFileNum; i++)
	{
		QString strCreateDir = m_strSaveDir;
		if (strCreateDir.endsWith('/') == false)
		{
			strCreateDir += "/";
		}

		if (m_bCNName)
		{
			strCreateDir += QString("%1_%2_%3/").arg(1+1).arg(i+1).arg("文件夹"/*getRandChinese(5)*/);
		}else{
			strCreateDir += QString("%1_%2_%3/").arg(1+1).arg(i+1).arg(getRandomString(m_nFileNameLen));
		}
		CreateDir(strCreateDir, 2);
	}
}
